1
超越 NULL 陷阱
AI013Lesson 2
00:00

从 C 风格的宏过渡到 C++ 的类型安全字面量,标志着语言可用性的根本性转变,解决了 “NULL 陷阱” 零宏定义歧义导致无声逻辑错误的问题。

1. 重载解析失败

在旧版标准(C++98)中, NULL 通常被定义为 0。当传递给重载函数时,编译器将它解析为整数。这由以下代码证实: NULL 作为整数。这一点可以通过以下代码证明:

if (std::is_same_v<decltype(NULL), int>)
std::cout << "NULL 是一个整数";

2. nullptr 解决方案

C++11 引入了 nullptr,一个类型为 std::nullptr_t的关键词。与宏不同,它不能隐式转换为整型(除 bool 外),从而确保选择指针专用的重载函数。

旧版陷阱foo(NULL)调用 foo(int)现代解决方案foo(nullptr)调用 foo(char*)

3. 链接与互操作性

现代 C++ 要求使用 extern "C" 来防止链接 C 代码时发生符号名混淆(例如,使用 gcc编译)。在此边界保持类型安全的指针至关重要。

$$\text{std::nullptr\_t} \neq \text{int}$$

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>